import json
import time

import requests
from WeiboSpider.util.log import login


######################################################################

class YDMHttp:
    apiurl = 'http://api.yundama.com/api.php'
    username = ''
    password = ''
    appid = ''
    appkey = ''

    def __init__(self, username, password, appid, appkey):
        self.username = username
        self.password = password
        self.appid = str(appid)
        self.appkey = appkey

    def request(self, fields, files=[]):
        try:
            response = self.post_url(self.apiurl, fields, files)
            response = json.loads(response)
        except Exception as e:
            login.exception(e)
            return None
        else:
            return response

    def balance(self):
        data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey}
        response = self.request(data)
        if (response):
            if (response['ret'] and response['ret'] < 0):
                return response['ret']
            else:
                return response['balance']
        else:
            return -9001

    def login(self):
        data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey}
        response = self.request(data)
        if (response):
            if (response['ret'] and response['ret'] < 0):
                return response['ret']
            else:
                return response['uid']
        else:
            return -9001

    def upload(self, filename, codetype, timeout):
        data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}
        file = {'file': filename}
        response = self.request(data, file)
        if (response):
            if (response['ret'] and response['ret'] < 0):
                return response['ret']
            else:
                return response['cid']
        else:
            return -9001

    def result(self, cid):
        data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid,
                'appkey': self.appkey, 'cid': str(cid)}
        response = self.request(data)
        return response and response['text'] or ''

    def decode(self, filename, codetype, timeout):
        cid = self.upload(filename, codetype, timeout)
        if (cid > 0):
            for i in range(0, timeout):
                result = self.result(cid)
                if (result != ''):
                    return cid, result
                else:
                    time.sleep(1)
            return -3003, ''
        else:
            return cid, ''

    def report(self, cid):
        data = {'method': 'report',
                'username': self.username,
                'password': self.password,
                'appid': self.appid,
                'appkey': self.appkey,
                'cid': str(cid),
                'flag': '0'}
        response = self.request(data)
        if (response):
            return response['ret']
        else:
            return -9001

    def post_url(self, url, fields, files=[]):
        for key in files:
            files[key] = open(files[key], 'rb');
        res = requests.post(url, files=files, data=fields)
        return res.text


######################################################################

# # 用户名
# username = 'username'
#
# # 密码
# password = 'password'
#
# # 软件ＩＤ，开发者分成必要参数。登录开发者后台【我的软件】获得！
# appid = 4072
#
# # 软件密钥，开发者分成必要参数。登录开发者后台【我的软件】获得！
# appkey = '1be0b9b3382c588d8ffd47db7910bacd'
#
# # 图片文件
# filename = 'getimage.jpg'
#
# # 验证码类型，# 例：1004表示4位字母数字，不同类型收费不同。请准确填写，否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
# codetype = 1005
#
# # 超时时间，秒
# timeout = 60
#
# # 检查
# if (username == 'username'):
#     print('请设置好相关参数再测试')
# else:
#     # 初始化
#     yundama = YDMHttp(username, password, appid, appkey)
#
#     # 登陆云打码
#     uid = yundama.login();
#     print('uid: %s' % uid)
#
#     # 查询余额
#     balance = yundama.balance();
#     print('balance: %s' % balance)
#
#     # 开始识别，图片路径，验证码类型ID，超时时间（秒），识别结果
#     cid, result = yundama.decode(filename, codetype, timeout);
#     print('cid: %s, result: %s' % (cid, result))


######################################################################

def code_verificate(username, password, filename, codetype=1005, timeout=60, appid=4072,
                    appkey='1be0b9b3382c588d8ffd47db7910bacd'):
    '''
    :param username: 用户名
    :param password: 密码
    :param filename: 图片文件
    :param codetype: 验证码类型,例：1004表示4位字母数字，不同类型收费不同。
    :param timeout: 超时时间,秒
    :param appid: 软件ID,开发者分成必要参数
    :param appkey: 软件密钥,开发者分成必要参数
    :return: 验证码结果
    '''
    yundama = YDMHttp(username, password, appid, appkey)
    uid = yundama.login()
    # print('uid: %s' % uid)
    balance = yundama.balance()
    # print('balance: %s' % balance)
    if balance <= 0:
        raise Exception('云打码已经欠费了，请及时充值')
    elif balance <= 100:
        login.warning('云打码余额已不多，请注意及时充值')
    cid, result = yundama.decode(filename, codetype, timeout);
    # login.info('cid: %s, result: %s' % (cid, result))
    return result, yundama, cid
